package com.itany.corejava.code11_io.字节流;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 石小俊
 * @date 2023年05月11日 15:52
 */
public class Test05_对象输入输出流 {
    public static void main(String[] args) {
        test01();
        test02();
    }

    /**
     * 序列化:将对象转换成二进制数据,可以通过一个文件来保存序列化后的二进制流
     */
    public static void test01() {
        User user = new User(1, "admin", "123456");
        User user2 = new User(2, "alice", "123456");
        User user3 = new User(3, "jack", "123456");
        List<User> users = Arrays.asList(user, user2, user3);
        List list = new ArrayList();

        ObjectOutputStream oos = null;
        try {
            // 创建对象输出流,此时的参数是一个OutputStream
            // 可以指定一个文件,用于接收二进制流,写入的文件格式无所谓,因此打开都看不懂
            // 字节流
            OutputStream out = new FileOutputStream("users.data");
            // 包装流
            oos = new ObjectOutputStream(out);

            // 写入对象
            // 写入的对象可以是任意类型
            // 可以是基本数据类型
//            oos.writeObject(1);
//            oos.writeObject(true);
//            oos.writeObject('a');
//            oos.writeObject(user);
//            oos.writeObject(user2);
//            oos.writeObject(user3);
            // oos.writeObject(users);

            list.add(1);
            list.add(true);
            list.add('a');
            list.add(user);
            list.add(user2);
            list.add(user3);
            oos.writeObject(list);

            // 刷新流
            oos.flush();

            System.out.println("对象序列化成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void test02() {
        try (
                ObjectInputStream in = new ObjectInputStream(new FileInputStream("users.data"));
        ) {
            // 由于写入的数据可以是任意类型
            // 取出的数据返回值是Object
            // 从指定的文件中读取对应的对象信息
            // 此处读取出来的数据的顺序与写入的数据顺序一致
//            Object obj = in.readObject();
//            System.out.println(obj);
//            obj = in.readObject();
//            System.out.println(obj);
//            obj = in.readObject();
//            System.out.println(obj);
//            obj = in.readObject();
//            System.out.println(obj);
//            obj = in.readObject();
//            System.out.println(obj);
//            obj = in.readObject();
//            System.out.println(obj);
//            obj = in.readObject();
//            System.out.println(obj);

//            Object obj = in.readObject();
//            List<User> users = (List<User>) obj;
//            for(User user : users){
//                System.out.println(user);
//            }

            // 在读取数据时,每执行一次readObject读取一次writeObject方法所写入的数据
            // 如果超出了写入数据的次数,则报错
            // 因此,在写入数据的时候,建议使用集合存放所有的需要写入数据
            // 一次性进行写入
            // 那么在读取时只需要读取一次即可
            Object obj = in.readObject();
            List list = (List) obj;
            for (Object o : list) {
                System.out.println(o);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
